package com.pzhu.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

//问题：
//  Request对象解决了一次请求内的不同Servlet的数据共享问题，那么一个用户的不同请求的处理需要使用相同的数据怎么办呢?
//解决：
//  使用 session技术。
//原理：
//  用户使用浏览器第一次向服务器发送请求，服务器在接受到请求后，调用对应的 Servlet进行处理。
//  在处理过程中会给用户创建一个 Session对象，用来存储用户请求处理相关的公共数据，并将此 Session对象的  JSESSIONID以  Cookie的形式存储在浏览器中(临时存储，浏览器关闭即失效)。
//  用户在发起第二次请求及后续请求时，请求信息中会附带 JSESSIONID，服务器在接收到请求后，调用对应的 Servlet进行请求处理，同时根据 JSESSIONID返回其对应的 session对象。
//特点：
//  Session技术是依赖Cookie技术的服务器端的数据存储技术。由服务器进行创建，每个用户独立拥有一个Session，默认存储时间为 30分钟
//作用：
//  解决了一个用户的不同请求的数据共享问题。
//使用：
//  创建 Session对象，存储数据到 Session对象，获取 Session对象，获取数据从 Session对象，如果获取 Session中不存在的数据返回 null。
//注意：
//  只要不关闭浏览器，并且 Session不失效的情况下，同一个用户的任意请求在项目的任意Servlet中获取到的都是同一个Session对象。
//作用域：
//  一次会话
//
//****创建session对象/获取session对象****
//  HttpSession hs=req.getSession();
//  如果请求中拥有Session的标识符也就是JSESSIONID，则返回其对应的Session对象
//  如果请求中没有Session的标识符也就是JSESSIONID，则创建新的Session对象，并将该JSESSIONID作为cookie数据存储到浏览器内存中。
//  如果Session对象失效了，也会重新创建一个Session对象，并将其JSESSIONID存储在浏览器内存中。

public class SessionServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        //设置请求和响应编码格式
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        //创建Session对象实例
        HttpSession hs=req.getSession();
        System.out.println(hs.getId());
        //添加Session数据
        String name1="张三";
        hs.setAttribute("name", name1);
        //设置Session存储时间（秒）
        hs.setMaxInactiveInterval(10);
        //强制Session失效
//		hs.invalidate();
        //浏览器访问提示语
        resp.getWriter().write("这是SessionServlet");
    }

}
